iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 2
2
Software Development

啥物碗Golang? 30天就Go系列 第 2

Go環境安裝on Mac

  • 分享至 

  • xImage
  •  

不管選擇哪個主題,一開始一定都是從裝環境著手,幸好go的環境安裝相當簡單。因為是Mac使用者這邊就只介紹mac方案,windos與linux就參考官網上的說明。

如果你是Mac環境,可以直接使用Homebrew安裝(假如你是Ruby工程師,我假設你已經裝好Homebrew了,如果沒有,可以參考這裏)。打開你的終端機,輸入:

$ brew install go

是的,就是這麼簡單,一行搞定。brew會幫我們自動下載、解壓縮、安裝,檢查相關套件。不過在這之前他會先檢查homebrew自己的更新(有自肥的嫌疑),可能因為我許久沒更新了,在我的環境下大約花了五分鐘之久。

==> Cloning https://go.googlesource.com/tools.git
Cloning into '/Users/Chenbater/Library/Caches/Homebrew/go--gotools--git'...
==> Checking out branch release-branch.go1.11
Already on 'release-branch.go1.11'
Your branch is up-to-date with 'origin/release-branch.go1.11'.
==> go build
==> Caveats
A valid GOPATH is required to use the `go get` command.
If $GOPATH is not specified, $HOME/go will be used by default:
  https://golang.org/doc/code.html#GOPATH

You may wish to add the GOROOT-based install location to your PATH:
  export PATH=$PATH:/usr/local/opt/go/libexec/bin
==> Summary
?  /usr/local/Cellar/go/1.11.1: 9,279 files, 404MB, built in 2 minutes 18 seconds

你可以看到它自動下載最新版本,然後安裝的過程。具體安裝go只花了約兩分鐘。上面的提示訊息有提醒我們要設定環境變數。我們先來檢查一下是否安裝成功:

$ go version
go version go1.11.1 darwin/amd64

用version指令來檢查go的版本,你應該會得到大於等於go1.11.1的版本。基於ruby的習慣,我嘗試了一下有沒有縮寫(XD)得到的答案是沒有。不像ruby可以用ruby -v這樣懶惰的一個字帶過,必須要把version完完整整的打出來。經過了三年ruby的洗禮,我可能已經養成了能用一個字母就不需要打出整個單字的習慣,我想這應該是語言影響思維的例子之一。

順帶一提,只要輸入了go認不得的指令,就會叫出help提示,這點倒是相當方便,我們可以看一下有哪些指令:

$ go help
Go is a tool for managing Go source code.

Usage:

	go <command> [arguments]

The commands are:

	bug         start a bug report
	build       compile packages and dependencies
	clean       remove object files and cached files
	doc         show documentation for package or symbol
	env         print Go environment information
	fix         update packages to use new APIs
	fmt         gofmt (reformat) package sources
	generate    generate Go files by processing source
	get         download and install packages and dependencies
	install     compile and install packages and dependencies
	list        list packages or modules
	mod         module maintenance
	run         compile and run Go program
	test        test packages
	tool        run specified go tool
	version     print Go version
	vet         report likely mistakes in packages

Use "go help <command>" for more information about a command.

Additional help topics:

	buildmode   build modes
	c           calling between Go and C
	cache       build and test caching
	environment environment variables
	filetype    file types
	go.mod      the go.mod file
	gopath      GOPATH environment variable
	gopath-get  legacy GOPATH go get
	goproxy     module proxy protocol
	importpath  import path syntax
	modules     modules, module versions, and more
	module-get  module-aware go get
	packages    package lists and patterns
	testflag    testing flags
	testfunc    testing functions

Use "go help <topic>" for more information about that topic.

環境完成之後,我們來建立一個hello world,首先打開一個喜歡的編譯器,然後貼上以下的程式碼:

// 宣告程式屬於哪個 package
package main

// 引入套件
import (
    "fmt"
)

// 程式執行入口
func main() {
    // 使用 fmt 套件印出字串 word,使用 := 簡化原本變數宣告 var word string = "Hello, World!"
    word := "Hello, World!"
    fmt.Println(word)
}

一開始不懂沒關係因為我也不懂,學習程式都是從複製貼上開始,程式會動以後,再慢慢瞭解每一行程式的意涵。如果要了解每一個部分才動手,這樣不只沒有效率,也容易裹足不前。每個go程式都是由package組成。前面有提過go是一種編譯語言,也就是執行前需要經過編譯,但使用run會事先幫我們進行編譯然後執行。我們將剛剛的檔案儲存為hello.go,然後在指令行輸入:

$ go run hello.go
Hello, World!

但每次直接執行前都要編譯過一次有點麻煩,我們也可以事先編譯省時間,所以我們使用build指令:

$ go build hello.go

這個指令沒有回傳值,但是會生成一個同名的二進制檔案(但是沒有.go的副檔名)。以後要執行只需要:

$ ./hello
Hello, World!

就可以得到一樣的結果!

註解的方式與js一樣,單行註解使用//開頭,多行註解在開頭結尾使用/* 我是註解 */。特別提醒一個新手容易犯下的錯誤,雖然看起來跟js有點像,但是{開頭不能單獨存在一行,強硬地解決了工程師圈關於{到底要在函式名稱後還是要在下一行的爭論。

func main()  
{  // 看起來很合理,但是會錯!
    fmt.Println("Hello, World!")
}

go還貼心的提供了統整格式的工具,應該是發明人受夠了工程師一天到晚針對格式吵架了吧。使用指令fmt

$ go fmt hello.go
hello.go:10:1: expected declaration, found '{'
exit status 2

就可以把剛剛故意改到下一行的{抓出來唷。通過檢查的話,不會有回傳值。go還有提供許多方便的指令,我們在後續如果有用到再一一介紹吧。

Reference


上一篇
在2018年底,我們學一學Go
下一篇
變數、常數與命名
系列文
啥物碗Golang? 30天就Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0

寫得很清楚喔!讓人忍不住想照著文章的步驟玩玩看!Go Go Go!

我要留言

立即登入留言